package com.hspedu.codeblock;

/**
 * @Author Stringzhua
 * @Date 2024/3/5 17:54
 * description:1. 加载类信息 2. 初始化父类 3.初始化子类 4.子类构造器创建对象
 * 顺序为
 * step1:父类的静态代码块和静态属性
 * step2:子类的静态代码块和静态属性
 * step3:父类的普通代码块和普通属性
 * step4:父类的构造器
 * step5:子类的普通代码块和普通属性
 * step6:父类的构造器
 */
public class CodeBlockDetail04 {
    public static void main(String[] args) {
//        new Son();
        /*1.进行类的加载
        * 1.1先加载Father类
        * 1.2再加载Son类
        * 2.创建对象
        * 2.1先从子类的构造器开始
        * 2.2
        * 输出结果为:
Father的getVal01()被调用...
Father的一个静态代码块...
Son的getVal01()被调用...
Son的一个静态代码块...
Father的一个普通代码块...
Father的getVal02()被调用...
Father的构造器被调用...
Son的一个普通代码块...
Son的getVal02()被调用...
Son的构造器被调用...
        */
        new C02();
    }
}

class C02 {
    private int n1 = 100;
    private static int n2 = 200;

    private void m1() {
        System.out.println("m1()方法");
    }

    private static void m2() {
        System.out.println("static m2()方法");
    }

    static {
        //静态代码块只能调用静态成员
//        System.out.println(n1);错误
        System.out.println(n2);
//        m1();//错误
        m2();
    }

    {//静态代码块可以调用任意成员
        System.out.println("n1 = " + n1);
        System.out.println("n2 = " + n2);
        m1();
        m2();
    }
}

class Father {//父类
    private static int n1 = getVal01();

    static {
        System.out.println("2Father的一个静态代码块...");//-->2
    }

    public int n3 = getVal02();

    {
        System.out.println("6Father的一个普通代码块...");//-->6
    }


    public static int getVal01() {
        System.out.println("1Father的getVal01()被调用...");//-->1
        return 10;
    }

    public static int getVal02() {
        System.out.println("5Father的getVal02()被调用...");//-->5
        return 10;
    }

    public Father() {
        //隐藏super()
//        super();
        System.out.println("7Father的构造器被调用...");//-->7
    }
}

class Son extends Father {//子类
    private static int n3 = getVal03();

    static {
        System.out.println("4Son的一个静态代码块...");//-->4
    }

    public int n5 = getVal04();

    {
        System.out.println("9Son的一个普通代码块...");//-->9
    }

    public static int getVal03() {
        System.out.println("3Son的getVal03()被调用...");//-->3
        return 10;
    }

    public static int getVal04() {
        System.out.println("8Son的getVal04()被调用...");//-->8
        return 10;
    }

    public Son() {
        //隐藏了super()
//        super();
        System.out.println("10Son的构造器被调用...");//-->10
    }
}
